import type { GlobEnvConfig } from '/#/config';
import pkg from '../../package.json';

/**
 * 获取通用存储前缀
 * @returns 通用存储前缀字符串
 */
export function getCommonStoragePrefix() {
  // 获取环境配置中的应用标题
  const { VITE_GLOB_APP_TITLE } = getAppEnvConfig();

  // 将应用标题中的空格替换为下划线，并结合环境变量生成存储前缀字符串
  return `${VITE_GLOB_APP_TITLE.replace(/\s/g, '_')}__${getEnv()}`.toUpperCase();
}

/**
 * 根据版本生成缓存键
 * @returns 存储短名称字符串
 */
export function getStorageShortName() {
  // 获取通用存储前缀，并结合包版本号生成存储短名称字符串
  return `${getCommonStoragePrefix()}${`__${pkg.version}`}__`.toUpperCase();
}

const getVariableName = (title: string) => {
  function strToHex(str: string) {
    const result: string[] = [];
    for (let i = 0; i < str.length; ++i) {
      const hex = str.charCodeAt(i).toString(16);
      result.push(('000' + hex).slice(-4));
    }
    return result.join('').toUpperCase();
  }
  return `__PRODUCTION__${strToHex(title) || '__APP'}__CONF__`.toUpperCase().replace(/\s/g, '');
};

// 获取应用环境的配置信息
export function getAppEnvConfig() {
  // 获取环境变量中的全局应用标题
  const ENV_NAME = getVariableName(import.meta.env.VITE_GLOB_APP_TITLE);

  // 根据当前环境（开发环境或生产环境）获取相应的环境配置
  const ENV = import.meta.env.DEV
    ? // 如果是开发环境，则直接从 import.meta.env 中取得整个环境配置对象
      // 当打包时，配置会自动提取为独立的全局配置
      (import.meta.env as unknown as GlobEnvConfig)
    : // 如果是生产环境，则从 window 对象中获取，该对象通过名为 ENV_NAME 的属性暴露配置
      (window[ENV_NAME] as unknown as GlobEnvConfig);

  // 从环境配置对象中解构所需要的环境变量
  const { VITE_GLOB_APP_TITLE, VITE_GLOB_API_URL, VITE_GLOB_API_URL_PREFIX, VITE_GLOB_UPLOAD_URL } =
    ENV;

  // 返回包含具体环境变量值的对象
  return {
    VITE_GLOB_APP_TITLE,
    VITE_GLOB_API_URL,
    VITE_GLOB_API_URL_PREFIX,
    VITE_GLOB_UPLOAD_URL,
  };
}

/**
 * @description: Development mode
 */
export const devMode = 'development';

/**
 * @description: Production mode
 */
export const prodMode = 'production';

/**
 * @description: Get environment variables
 * @returns:
 * @example:
 */
export function getEnv(): string {
  return import.meta.env.MODE;
}

/**
 * @description: Is it a development mode
 * @returns:
 * @example:
 */
export function isDevMode(): boolean {
  return import.meta.env.DEV;
}

/**
 * @description: Is it a production mode
 * @returns:
 * @example:
 */
export function isProdMode(): boolean {
  return import.meta.env.PROD;
}
